package common

import (
	"database/sql/driver"
	"fmt"
	"time"
)

// 自定义时间类型，封装 time.Time
type CustomTime struct {
	time.Time
}

// 定义时间格式
const timeFormat = "2006-01-02 15:04:05"

// 实现自定义的 MarshalJSON 方法
func (ct CustomTime) MarshalJSON() ([]byte, error) {
	formattedTime := fmt.Sprintf(`"%s"`, ct.Format(timeFormat))
	return []byte(formattedTime), nil
}

// 实现自定义的 UnmarshalJSON 方法
func (ct *CustomTime) UnmarshalJSON(data []byte) error {
	// 去掉双引号
	str := string(data)
	str = str[1 : len(str)-1]

	// 解析时间
	parsedTime, err := time.Parse(timeFormat, str)
	if err != nil {
		return err
	}

	ct.Time = parsedTime
	return nil
}

// 实现 driver.Valuer 接口，用于将值保存到数据库
func (ct CustomTime) Value() (driver.Value, error) {
	// 将 CustomTime 转换为字符串以便保存到数据库
	return ct.Format(timeFormat), nil
}

// 实现 sql.Scanner 接口，用于从数据库中读取值
func (ct *CustomTime) Scan(value interface{}) error {
	// 检查 value 的类型是否为字符串或时间
	if value == nil {
		*ct = CustomTime{Time: time.Time{}}
		return nil
	}

	switch v := value.(type) {
	case time.Time:
		*ct = CustomTime{Time: v}
	case []byte:
		parsedTime, err := time.Parse(timeFormat, string(v))
		if err != nil {
			return err
		}
		*ct = CustomTime{Time: parsedTime}
	case string:
		parsedTime, err := time.Parse(timeFormat, v)
		if err != nil {
			return err
		}
		*ct = CustomTime{Time: parsedTime}
	default:
		return fmt.Errorf("cannot scan type %T into CustomTime", value)
	}

	return nil
}
